


#ifndef _Komunikacja
#define _Komunikacja

#include "LLotnisko.h"
#include "Samolot.h"
#include "GUI.h"
#include "../m_connection_tests/komunikacja1.2.h"


/* KARBOS
Obiekt komunikacja tworzony jest w mainie. Do kazdego samolotu i do klasy lotnisko dolaczony jest
wskaznik do obiektu komunikacja.
*/
class Komunikacja
{
public:


	//wskaznik na lotnisko
	LLotnisko * lotnisko;


	//KOMUNIKACJA Z BD
	
	//metoda ktora pobiera z bazy danych info o lotnisku.
	void DB_getLotnisko(int id, LLotnisko *);
	//wywoluje funkcje lotniska getLotnisko(nazwa, pojemnosc, szerokosc, dlugosc, 
	//												ilosc pasow waskich, ilsc pasow szerokich)
	
	
	//metoda pobiera z bazy danych info o modelu samolotu.
	void DB_getSamolot(string nazwa,Samolot * samolot);
	//return : czas oblsugi i czyszeroki pas.
	//uzupelnia te pola w klasie Samolot wywolujac funkcje samolotu getSamolot(czasObslugi, czySzeroki)
	
	
	//metoda wysylajaca info o aktywnosci lotniska.
	void DB_send_jestemaktywny();
	
	
	//KOMUNIKACJA Z ZEUSEM.
	
	//metody wywoluja metody lotniska setAwaria i resetAwaria
	
	//ustawia awarie w lotnisku
	//ma wywolywac funkcje lotniska setAwaria()
	void Kom_setAwaria (string nazwa, string podtyp,int  stopien);
	
	
	//usuwa awarie na lotnisku
	//ma wywolywac funkcje lotniska resetAwaria()
	void Kom_resetAwaria (string nazwa);
	
	
	
	//KOMUNIKACJA Z SAMOLOTEM.
	
	
	void Kom_ChceStartowac(int id);
	//Samolot chce sobie wystartowac.
	//zmienic status samolotu na ChceStartowac.
	//wywolac funkcje lotniska decyzjaOStarcie()
	
	
	void Kom_wystartujSamolot(int id);
	//wyslac sygnal samolotowi.
	
	void Kom_zakazStartu(int id, int czas);
	//wysyla samolotowi o id sygnal ze ponowic prosbe moze za czas jaki ma tam zapisany.
	
	
	void Kom_ChceLadowac(int id,bool awaria);
	//Samolot chce sobie ladowac.
	//zmienic status samolotu na ChceLadowac.
	//zmienic awarie jak cos.
	//wywolac funkcje lotniska decyzjaOLadowaniu()
	
	
	
	void Kom_wyladujSamolot(int id);
	//wyslac sygnal samolotowi.
	
	void Kom_zakazLadowania(int id, int czas);
	//wysyla samolotowi o id sygnal ze ponowic prosbe moze za czas jaki ma tam zapisany.
	
	void Kom_odeslijSamolot(int id);
	//sygnal by spadal
	
	void Kom_polozenieSamolotu(int id,float szerokosc, float dlugosc);
	//ma lotnisko->listaSamolotow[id]->ustalPolozenie(lotnisko->gui,szerokosc,dlugosc) wywolac oczywiscie na watku.
	
	void Kom_samolotStrefaIN(int id, string model);
	
	void Kom_samolotStrefaOUT(int id, string model);
	// destruktor samolotu jakis.
	//lotnisko->listasamolotow[id]=NULL;
	
	void Kom_samolotNaLotnisku(int id, string model);
	
	
	void Kom_samolotKILL(int id);
	//gdy shangarowany.


};

/**
* Struktura reprezentujaca lotnisko.
*/
class lotniskoEv
{
	public:
		int id_lotniska;
		std::string nazwa;
		int pojemnosc;
		float szerokosc_geo;
		float dlugosc_geo;
		int ilosc_szerokich_pasow;
		int ilosc_waskich_pasow;
		bool aktywnosc;
};

class ConnectorAirport {

private:
	char * connName;
	static ConnectorAirport * instance;
	lotniskoEv*airportAI;
	samolot_dla_lotniska * planeAI;
	ConnectorAirport();
	Komunikacja *komAI;
	
		  std::vector<ConnFD> * connectionsOpened;
		  
public:
	static ConnectorAirport * getInstance();
	 void createListener(char * _connName);
	
	char * getConnName(void);
	 
	 sem_t semAirportDB_AI;
	 sem_t semPlaneDB_AI;
	 
	 /* funkcje pozwalajace ustawic nowy wektor na dane*/
	 void setAirportAI( lotniskoEv* arg);
	 void setPlaneAI( samolot_dla_lotniska* arg);
	 
	 /* funkcje pozwalajace dodac element do wektora */
	void airportCameAI( Message * msg);
	void planeCameAI( Message * msg);
	
	void setPtr( Komunikacja * kom);
	Komunikacja * getKomunikacja(void);
	
	   int isConnected( char * arg);
       void addConn(char *, int);
       void closeAllConns(void);
};
#endif
